﻿Imports Commander_Wars.Spieletools
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class ObjektSpielfeld
    Implements ICloneable
#Region "Variablen"
#Region "Konstanten"
	Public Const StartHoehe As Single = 15
    Public Const WarteZeitZwischenAnimationen As Integer = 8
    Public Const Bodenschlacht As Integer = 0
    Public Const Luftschlacht As Integer = 1
    Public Const TopLayer As Integer = 2
    Public Const LayerHoehe2Din3D As Single = 0.00001
    Enum SpielfeldLayer
        Keiner = 0
        LandschaftenUntergrund = 3
        Landschaften = 6
        Uebergaenge = 9
        Gebaeude = 12
        Einheiten = 15
        Einheitensymbole = 18
        MarkierteFelder = 21
        Animationen = 24
        Wetter = 27
        Pfeile = 30
        Cursor = 100
    End Enum

    Public Shared Function GetLayerHoehe(ByVal Layer As SpielfeldLayer, ByVal KooY As Single) As Single
        Dim Vergroesserer As Integer = Math.DivRem(CInt(Objektverwalter.Spielfeld.KameraHoehe), 6, 0) * 5
        If Vergroesserer = 0 Then Vergroesserer = 1
        Return (Layer + KooY * 2) * LayerHoehe2Din3D * Vergroesserer
    End Function
    Public Shared Function CalcDraw2D3DVec(ByVal KooX As Single, ByVal Layer As SpielfeldLayer, ByVal KooY As Single) As Vector3
        Return New Vector3(KooX, ObjektSpielfeld.GetLayerHoehe(Layer, KooY), -KooY) '
    End Function
#End Region
	public ShowAIData as boolean = false
    Public SpielfeldLocker As New Mutex
    Public EingabenErlauben As Boolean = True
    Public BildschirmKooX As Integer
    Public BildschirmKooY As Integer
    Public KameraPos As Vector3
    Private pKameraTarget As Vector3

    Public Property KameraTarget() As Vector3
        Get
            Return pKameraTarget
        End Get
        Set(ByVal value As Vector3)
            pKameraTarget = value
            KameraPosBerechnen()
        End Set
    End Property

    Private pKameraVerhaeltnisWeite As Single = 5
    Public Property KameraVerhaeltnisWeite() As Single
        Get
            Return pKameraVerhaeltnisWeite
        End Get
        Set(ByVal value As Single)
            pKameraVerhaeltnisWeite = value
            KameraPosBerechnen()
        End Set
    End Property
    Private pKameraHoehe As Single = StartHoehe
    Public Property KameraHoehe() As Single
        Get
            Return pKameraHoehe
        End Get
        Set(ByVal value As Single)
            pKameraHoehe = value
            KameraPosBerechnen()
        End Set
    End Property
    Private pKameraRichtung As Single = 0 'Vector3.Normalize(New Vector3(0, -10, 1))
    Public Property KameraRichtung() As Single
        Get
            Return pKameraRichtung
        End Get
        Set(ByVal value As Single)
            pKameraRichtung = value 'Ich nehm nur normalisierte Vektoren!
            KameraPosBerechnen()
        End Set
    End Property
    ''' <summary>
    ''' Wird automatisch aufgerufen, wenn sich die Kamerahoehe, oder die Kamerarotation aendert.
    ''' </summary>
    ''' <remarks></remarks>
    Sub KameraPosBerechnen()
        If DataSettings._2D_3D_Malen Then
            pKameraRichtung = 0
            pKameraVerhaeltnisWeite = 5
        End If
        If pKameraHoehe < 1 Then pKameraHoehe = 1
        If pKameraHoehe > 640 Then pKameraHoehe = 640
        If pKameraVerhaeltnisWeite < 0.2 Then pKameraVerhaeltnisWeite = 0.2
        If pKameraVerhaeltnisWeite > 7 Then pKameraVerhaeltnisWeite = 7
        Dim KameraWeite As Single = pKameraHoehe / pKameraVerhaeltnisWeite
        '        KameraPos = New Vector3(-Math.Sin(pKameraRichtung), +pKameraHoehe, -Math.Cos(pKameraRichtung))
        KameraPos = Vector3.Add(New Vector3((-Math.Sin(pKameraRichtung)) * KameraWeite, pKameraHoehe, -Math.Cos(pKameraRichtung) * KameraWeite), KameraTarget)
        Grafikengine.CreateCameraPosition()
        Grafikengine.CalculateBackgroundVertex()
    End Sub
    ''' <summary>
    ''' Setzt die Kamera auf die Startwerte
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub IniCamera()
        'Jetzt das Spielfeld richtig zentrieren.
        pKameraTarget = New Vector3(Breite / 2, 0, -Hoehe / 2)
        KameraPos = New Vector3(Breite / 2, 70, -Hoehe / 2 - 1)
        pKameraRichtung = 0
        pKameraVerhaeltnisWeite = 5
        If DataSettings.draw3D Then
            pKameraHoehe = StartHoehe
        ElseIf DataSettings._2D_3D_Malen Then
            pKameraHoehe = StartHoehe + 10
        End If
        KameraPosBerechnen()
    End Sub
    ''' <summary>
    ''' Moves the Camera to the Middle of the Screen
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub CenterCamera()
        pKameraTarget = New Vector3(Breite / 2, 0, -Hoehe / 2)
        KameraPos = New Vector3(Breite / 2, 70, -Hoehe / 2 - 1)
        pKameraRichtung = 0
        pKameraVerhaeltnisWeite = 5
        KameraPosBerechnen()
    End Sub
    Public Kartenname As String = ""
    Public Beschreibung As String = "Keine Beschreibung vorhanden."
    Public Autor As String = ""
    ''' <summary>
    ''' Ein Wert setzt den Tag um eins nach oben
    ''' </summary>
    ''' <remarks></remarks>
    Private Runden As Integer = 0
    Public Property Runde() As Integer
        Get
            Return Runden
        End Get
        Set(ByVal value As Integer)
            Runden += 1
        End Set
    End Property
    Public Sub SetRunde(ByVal Runde As Integer)
        Runden = Runde
    End Sub
    Public AktuelleEinheit As ObjektEinheit
    ''' <summary>
    ''' Das Wegsuchsystem der Aktuellen Einheit
    ''' </summary>
    ''' <remarks></remarks>
    Public Wegsuchsystem As Wegsuchsystem
    Public AktuelleEinheitPosition As Point
    Public Laufen As ObjektLaufen
    Public LaufenLoeschen As Boolean = False
    Public AktuelleEinheitPfeil As ObjektPfeil
    Public AktuelleEinheitHatGefeuert As Boolean = False
    Public Animationen() As ObjektAnimation = {}
    Public AngriffsAnzeige As ObjektLabel
    Public CurrentAI As ObjektKI
    Public KOInfos As ObjektKOInformation
    Public Game_Timer() As Timer
    Public StartRechteck As Rectangle
    Public MapPosition As String = ""
    Private Frames As Integer
    Public Property Frame() As Integer
        Get
            Return Frames
        End Get
        Set(ByVal value As Integer)
            Frames += 1
            If Frames > 3 Then
                Frames = 0
            End If
        End Set
    End Property
    Private Wetterframes As Integer
    Public Property Wetterframe() As Integer
        Get
            Return Wetterframes
        End Get
        Set(ByVal value As Integer)
            Wetterframes += 1
            If Wetterframes > 15 Then
                Wetterframes = 0
            End If
        End Set
    End Property
    Public Landschaften(,,) As ObjektLandschaft
    Public Einheiten(,,) As ObjektEinheit = {}
    Public MomentaneSchlacht As Integer = 0
    Public Breite As Integer
    Public Hoehe As Integer
    Public Spieler() As ObjektSpieler = {}
    Public AktuellerSpieler As ObjektSpieler
    Public Regeln As ObjektRegeln

    Public CommanderWarsModus As CommanderWarsGameModi
    Public KOAnzeigen As ObjektKOAnzeigen
    Public InfoAnzeige As ObjektInfoAnzeige
    Public RundenAnfangAnzeige As RundenAnfangBild
    Public Angriff As ObjektAngriff
    Enum Wetterarten
        Sonne
        Regen
        Schnee
        Sandsturm
    End Enum
    Public KIPause As Boolean = False
    '  Public KOTextSprechen As ObjektKODialog
    Public AnimationsBackbuffer As BackbufferSpiel

    Public Scripts() As ObjektScript = {}
    Public NaechsteKarte As String
    Public DieseKarte As String
    Public Aufzeichnung As ObjektAufzeichnungen = Nothing
    Public ObjektLandkartenInfo As ObjektLandkartenInfos = Nothing
    ''' <summary>
    ''' Die Felder auf dem Spielfeld die man sehen kann.
    ''' </summary>
    ''' <remarks></remarks>
    Public MenschlichesSichtfeld(,,) As Boolean
#End Region
    Public Sub New(ByVal neuBreite As Integer, ByVal neuHoehe As Integer, ByVal neuSpieler() As ObjektSpieler, ByVal neuRegeln As ObjektRegeln, Optional ByVal Texture As Boolean = True)
        Autor = DataSettings.Autor
        If Autor = "" Then
            Autor = "Anonym"
        End If
        IniCamera()
        Breite = neuBreite
        Hoehe = neuHoehe
        Spieler = neuSpieler
        Regeln = neuRegeln
        AnimationsBackbuffer = New BackbufferSpiel
        ReDim Landschaften(neuBreite - 1, neuHoehe - 1, 1)
        ReDim Einheiten(neuBreite - 1, neuHoehe - 1, 1)
        For X = 0 To Breite - 1
            For Y = 0 To Hoehe - 1
                Landschaften(X, Y, 0) = New ObjektLandschaft("EBENE", X, Y, Me)
                Landschaften(X, Y, 1) = New ObjektLandschaft("LUFT", X, Y, Me)
            Next
        Next
        If Texture Then
            Objektverwalter.ArmeeTexturenLaden(Spieler)
            'Im 3D Spiel die Farben erstellen!
            If DataSettings.draw3D Then
                ObjektLadeklasse.Gebaeude3D.IniSpielerfarben(Spieler)
            End If
        End If
        CommanderWarsModus = DataSettings.CommanderWarsGameModus
    End Sub
    Public Sub Malen()
        If Game_Timer IsNot Nothing Then
            If AktuellerSpieler IsNot Nothing Then
                Game_Timer(AktuellerSpieler.Spieler).Timer_Update()
                If Game_Timer(AktuellerSpieler.Spieler).Timer_Time_Up Then
                    Game_Timer(AktuellerSpieler.Spieler).End_Turn_Or_Game()
                Else
                    Game_Timer(AktuellerSpieler.Spieler).Draw()
                End If
            End If
        End If
        BackbufferSpiel.Frame()
        If DataSettings.draw3D Then
            Grafikengine.Sprite.End()
            'Wir malen eine Kaeseglocke. Moment wo ist der Kaese?
            'Eagle rueck den Kaese raus!
            Dim M As New Material
            M.Diffuse = Color.White
            M.Ambient = Color.White
            M.Emissive = Color.White
            Grafikengine.Grafikkarte.Material = M

            Dim StandardMatrix As Matrix = Grafikengine.Grafikkarte.Transform.World
            Dim mat As Matrix = Matrix.Scaling(Breite, (Breite + Hoehe) / 2, Hoehe) * Matrix.Translation(Breite / 2, 0, -Hoehe / 2)

            TexturenHalter.GetKaeseGlocke.Malen(mat, Color.SkyBlue)

            Grafikengine.Grafikkarte.Transform.World = StandardMatrix

            For i = 0 To Objektverwalter.LandschaftenBilder.Length - 1
                Objektverwalter.LandschaftenBilder(i).Tick() 'eventuelle Berechnungen durchfuehren.
            Next
            ObjektmarkiertesFeld.FarbwerteBerechnen()
            Symbol3D.Berechnen() 'Der darf auch noch rumrotieren.
            If KameraPos.Y = 0 Then
                Grafikengine.Grafikkarte.Transform.Projection = Matrix.PerspectiveFovLH(Math.PI / 4, DataSettings.BildschirmBreite / DataSettings.BildschirmHoehe, Grafikengine._Kamera_NaehesteZiel, Grafikengine._Kamera_WeitesteZiel)
                KameraHoehe = StartHoehe
                KameraPos = New Vector3(0, 70, -1)
                KameraTarget = New Vector3(0, 0, 0)
                KameraRichtung = 0
            End If
        ElseIf DataSettings._2D_3D_Malen Then
            If KameraPos.Y = 0 Then
                Grafikengine.Grafikkarte.Transform.Projection = Matrix.PerspectiveFovLH(Math.PI / 4, DataSettings.BildschirmBreite / DataSettings.BildschirmHoehe, Grafikengine._Kamera_NaehesteZiel, Grafikengine._Kamera_WeitesteZiel)
                KameraHoehe = StartHoehe
                KameraPos = New Vector3(0, 70, -1)
                KameraTarget = New Vector3(0, 0, 0)
                KameraRichtung = 0
            End If
            Grafikengine.Sprite.End()
        End If

        'Laufen vorher im 3D wegen der Transparenz
        If DataSettings.draw3D Then
            If IsNothing(Laufen) = False Then
                Laufen.Einheitmalen()
            Else
                If IsNothing(AktuelleEinheit) = False Then
                    AktuelleEinheit.Malen(AktuelleEinheitPosition.X, AktuelleEinheitPosition.Y, 255)
                    If IsNothing(AktuelleEinheitPfeil) = False Then
                        AktuelleEinheitPfeil.Malen()
                    End If
                End If
            End If
        End If

        'Hier malen wir Landschaften
        DrawSchlacht(Bodenschlacht)


        'Die Luftschlacht wird jetzt gemalt
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
            DrawSchlacht(Luftschlacht)
        End If


        For I = 0 To Objektverwalter.MarkierteFelder.Count - 1
            Objektverwalter.MarkierteFelder(I).Malen()
        Next



        'Im 2D drueber malen damit man es sieht.
        If Not DataSettings.draw3D Then
            If IsNothing(Laufen) = False Then
                Laufen.Einheitmalen()
            Else
                If IsNothing(AktuelleEinheit) = False Then
                    AktuelleEinheit.Malen(AktuelleEinheitPosition.X, AktuelleEinheitPosition.Y, 255)
                    If IsNothing(AktuelleEinheitPfeil) = False Then
                        AktuelleEinheitPfeil.Malen()
                    End If
                End If
            End If
        End If

        If DataSettings._2D_3D_Malen Or DataSettings.draw3D Then
            Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
        End If

        If IsNothing(AngriffsAnzeige) = False Then
            AngriffsAnzeige.Malen()
        End If
        If IsNothing(InfoAnzeige) = False Then
            InfoAnzeige.Malen()
        End If
        If IsNothing(KOAnzeigen) = False Then
            KOAnzeigen.Malen()
        End If
        If Game_Timer IsNot Nothing Then
            If AktuellerSpieler IsNot Nothing Then
                Game_Timer(AktuellerSpieler.Spieler).Draw()
            End If
        End If
        If Not KOInfos Is Nothing Then
            KOInfos.Malen()
        End If
        If IsNothing(RundenAnfangAnzeige) = False Then
            If RundenAnfangAnzeige.Malen = True Then
                RundenAnfang()
            End If
        End If

        If DataSettings._2D_3D_Malen Or DataSettings.draw3D Then
            Grafikengine.Sprite.End()
        End If

        'Die Animationen im Toplayer werden gemalt.
        DrawAnimationen(TopLayer, 255)

        If DataSettings._2D_3D_Malen Or DataSettings.draw3D Then
            Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
        End If

        If IsNothing(Angriff) = False Then
            If Angriff.Malen = True Then
                'Der Kampf ist beendet jetzt muss er nur noch ausgewertet werden.
                Angriff.AngriffEnde()
                ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
                    ObjektMaus.Visible = False
                    Objektverwalter.Spielfeld.EingabenErlauben = False
                End If
                Angriff = Nothing
                Regeln.CheckSieg()
            End If
        End If
        If Not ObjektKODialog.AktuellerDialog Is Nothing Then
            If ObjektKODialog.AktuellerDialog.Malen = True Then
                ObjektKODialog.AktuellerDialog.Loeschen()
            End If
        End If

        Frame = 1

        'Auto Sub Updates
        If KIPause = False Then
            If IsNothing(CurrentAI) = False Then
                CurrentAI.KIFrame()
            End If
        End If
    End Sub
    Private Sub DrawSchlacht(ByVal Schlacht As Integer)
        Dim Alpha As Integer = 255
        'I hate this, but otherwise it would look a little bit strange.
        If DataSettings._2D_3D_Malen And MomentaneSchlacht <> Schlacht Then
            Exit Sub
        End If
        Dim intcolor As Color = Color.FromArgb(Alpha, 255, 255, 255)
        If Schlacht = Luftschlacht Then
            If MomentaneSchlacht = Luftschlacht Then
                Alpha *= 0.7#
            Else
                Alpha *= 0.2#
            End If
        End If
        Dim Xmax As Integer = 0
        Dim Ymax As Integer = 0
        Dim Xmin As Integer = 0
        Dim Ymin As Integer = 0
        If DataSettings.draw3D Or DataSettings._2D_3D_Malen Then
            Xmax = Breite
            Ymax = Hoehe
            Xmin = 0
            Ymin = 0

            If DataSettings.draw3D Then
                Objekt3D.SpielerFarbe = Objekt3D.Spielerfarben(0)
            End If
        Else
            Xmax = (-1 * Objektverwalter.Spielfeld.BildschirmKooX + DataSettings.BildschirmBreite - (DataSettings.BildschirmBreite - Hauptmenue.Rechteck.Width - Hauptmenue.Rechteck.X)) / ((Hauptmenue.Feldbreite)) + 1
            Ymax = (-1 * Objektverwalter.Spielfeld.BildschirmKooY + DataSettings.BildschirmHoehe - (DataSettings.BildschirmHoehe - Hauptmenue.Rechteck.Height - Hauptmenue.Rechteck.Y)) / (Hauptmenue.Feldbreite) + 1
            Xmin = (-1 * Objektverwalter.Spielfeld.BildschirmKooX + Hauptmenue.Rechteck.X) / (Hauptmenue.Feldbreite) - 1
            Ymin = (-1 * Objektverwalter.Spielfeld.BildschirmKooY + Hauptmenue.Rechteck.Y) / (Hauptmenue.Feldbreite) - 1
            If Xmin < 0 Then Xmin = 0
            If Ymin < 0 Then Ymin = 0
            If Xmax > Breite Then Xmax = Breite
            If Ymax > Hoehe Then Ymax = Hoehe
        End If
        If DataSettings.draw3D Then
            'einheiten
            For X = Xmin To Xmax - 1
                For Y = Ymin To Ymax - 1
                    If Not Landschaften(X, Y, Schlacht).Hidden Then
                        If IsNothing(Einheiten(X, Y, Schlacht)) = False Then
                            Einheiten(X, Y, Schlacht).Malen(X, Y, Alpha)
                        End If
                    End If
                Next
            Next
            'Landschaften
            For X = Xmin To Xmax - 1
                For Y = Ymin To Ymax - 1
                    If Not Landschaften(X, Y, Schlacht).Hidden Then
                        If Landschaften(X, Y, Schlacht).Gross = False Or DataSettings.draw3D Then
                            Grafikengine.szfScale = Nothing
                            Landschaften(X, Y, Schlacht).Malen(X, Y, Alpha)
                        End If
                    End If
                Next
            Next
            'Gebaeude
            For X = Xmin To Xmax - 1
                For Y = Ymin To Ymax - 1
                    If Not Landschaften(X, Y, Schlacht).Hidden Then
                        If IsNothing(Landschaften(X, Y, Schlacht).Gebaeude) = False Then
                            Landschaften(X, Y, Schlacht).Gebaeude.Malen(Landschaften(X, Y, Schlacht).Kriegsnebel, Alpha, X, Y)
                        End If
                    End If
                Next
            Next
            'KO-Zone


            WetterMalen3D(Regeln.Wetter)

            DrawAnimationen(Schlacht, Alpha)
        Else

            For X = Xmin To Xmax - 1
                For Y = Ymin To Ymax - 1
                    If Not Landschaften(X, Y, Schlacht).Hidden Then
                        If Landschaften(X, Y, Schlacht).Gross = False Or DataSettings.draw3D Then
                            Grafikengine.szfScale = Nothing
                            Landschaften(X, Y, Schlacht).Malen(X, Y, Alpha)
                        End If
                    End If
                Next
            Next

            For X = Xmin To Xmax - 1
                For Y = Ymin To Ymax - 1
                    If Not Landschaften(X, Y, Schlacht).Hidden Then
                        If Not DataSettings.draw3D Then
                            If Landschaften(X, Y, Schlacht).Gross = True Then
                                Landschaften(X, Y, Schlacht).Malen(X, Y, Alpha)
                            End If
                            Landschaften(X, Y, Schlacht).DrawSpecialStyle(Alpha, True)
                        End If

                        Landschaften(X, Y, Schlacht).UebergaengeMalen(Alpha, X, Y)

                        If IsNothing(Landschaften(X, Y, Schlacht).Gebaeude) = False Then
                            Landschaften(X, Y, Schlacht).Gebaeude.Malen(Landschaften(X, Y, Schlacht).Kriegsnebel, Alpha, X, Y)
                        End If

                        If Not DataSettings.draw3D Then
                            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY)
                            Landschaften(X, Y, Schlacht).WetterMalen()

                            If Hauptmenue.Formmodus = Hauptmenue.Formmodi.Editor And Not DataSettings._2D_3D_Malen Then
                                If Landschaften(X, Y, Schlacht).BildIDFest Then
                                    intcolor = Color.FromArgb(Alpha, 255, 255, 255)
                                    Dim Symbol As Integer = FindElement(Objektverwalter.Symbolfunktion, "KeineAutoLandschaft", True)
                                    Grafikengine.szfScale = Nothing
                                    Grafikengine.recBild = Nothing
                                    With Grafikengine.ptfRotCenter
                                        .X = Hauptmenue.Feldbreite / 4
                                        .Y = Hauptmenue.Feldbreite / 4
                                    End With
                                    Grafikengine.ptfPosition.X -= Hauptmenue.Feldbreite / 4
                                    Grafikengine.ptfPosition.Y -= Hauptmenue.Feldbreite / 4
                                    Grafikengine.Sprite.Draw2D(Objektverwalter.Symbole(Symbol), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, 0, Grafikengine.ptfPosition, intcolor)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
            If ShowAIData Then
                If CurrentAI IsNot Nothing Then
                    If TypeOf CurrentAI Is AI_Heavy Then
                        CType(CurrentAI, AI_Heavy).ShowFrontlines()
                    End If
                End If
            End If




            For Each Player In Spieler
                If Not Player.KOS Is Nothing Then
                    If Player.KOS(0) IsNot Nothing Then
                        Dim KO As ObjektEinheit = Player.KOS(0).GetKOUnit
                        If Not KO Is Nothing Then
                            If KO.Sichtbar Then
                                If OnMap(KO.X, KO.Y) Then
                                    If KO.IsGetarnt(Regeln.LetzterMensch) = False Then
                                        If KO.GetMap = Schlacht Then
                                            Dim KORange As Integer = Player.KOS(0).GetKORange
                                            Dim Kreis As Integer(,) = Kreisfunktion(KORange)
                                            Dim TexturID As Integer = ObjektmarkiertesFeld.LoadTextur("MarkiertesFeld+Gelb")
                                            For X = 0 To KORange * 2
                                                For Y = 0 To KORange * 2
                                                    If Kreis(X, Y) >= 0 Then
                                                        If OnMap(X - KORange + KO.X, Y - KORange + KO.Y) Then
                                                            If Not Landschaften(X - KORange + KO.X, Y - KORange + KO.Y, Schlacht).Hidden Then
                                                                If DataSettings._2D_3D_Malen Then
                                                                    Dim cube(3) As CustomVertex.PositionTextured
                                                                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, Objektverwalter.FrameMarkierteFelder * 0.5, 1)
                                                                    cube(1) = New CustomVertex.PositionTextured(0, 0, 1, Objektverwalter.FrameMarkierteFelder * 0.5, 0)
                                                                    cube(2) = New CustomVertex.PositionTextured(1, 0, 0, Objektverwalter.FrameMarkierteFelder * 0.5 + 0.5, 1)
                                                                    cube(3) = New CustomVertex.PositionTextured(1, 0, 1, Objektverwalter.FrameMarkierteFelder * 0.5 + 0.5, 0)
                                                                    Grafikengine.malen2Din3D(ObjektSpielfeld.CalcDraw2D3DVec(X - KORange + KO.X, SpielfeldLayer.MarkierteFelder, (Y - KORange + KO.Y)), cube, ObjektmarkiertesFeld.Textur.GetTextur(TexturID), intcolor)
                                                                Else
                                                                    Grafikengine.szfScale = Nothing
                                                                    With Grafikengine.recBild
                                                                        .X = Hauptmenue.Feldbreite * Objektverwalter.FrameMarkierteFelder : .Width = Hauptmenue.Feldbreite
                                                                        .Y = 0 : .Height = Hauptmenue.Feldbreite
                                                                    End With
                                                                    With Grafikengine.ptfRotCenter
                                                                        .X = Hauptmenue.Feldbreite / 2
                                                                        .Y = Hauptmenue.Feldbreite / 2
                                                                    End With
                                                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * (X - KORange + KO.X) + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * (Y - KORange + KO.Y) + Objektverwalter.Spielfeld.BildschirmKooY)
                                                                    Grafikengine.Sprite.Draw2D(ObjektmarkiertesFeld.Textur.GetTextur(TexturID), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, 0, Grafikengine.ptfPosition, intcolor)
                                                                End If
                                                            End If
                                                        End If
                                                    End If
                                                Next
                                            Next
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            Next

            For X = Xmin To Xmax - 1
                For Y = Ymin To Ymax - 1
                    If Not Landschaften(X, Y, Schlacht).Hidden Then
                        If IsNothing(Einheiten(X, Y, Schlacht)) = False Then
                            Einheiten(X, Y, Schlacht).Malen(X, Y, Alpha)
                        End If
                    End If
                Next
            Next

            DrawAnimationen(Schlacht, Alpha)
        End If
    End Sub
    Public Sub DrawAnimationen(ByVal Schlacht As Integer, Optional ByVal Alpha As Integer = 255)
        'Wir malen die Animationen dieser Schlacht
        Dim Max As Integer = Animationen.Length - 1
        Dim I As Integer = 0
        While I <= Max
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
            If Animationen(I).Schlacht < 0 Then Animationen(I).Schlacht = 0
            If Animationen(I).Schlacht = Schlacht Then
                If Animationen(I).Malen(Color.FromArgb(Alpha, 255, 255, 255)) = False Then
                    Animationen(I).RemoveHandles()
                    Animationen(I) = Nothing
                    Animationen(I) = Animationen(Animationen.Length - 1)
                    Array.Resize(Animationen, Animationen.Length - 1)
                    If Animationen.Length = 0 Then
                        If Not Objektverwalter.Spielfeld.AktuellerSpieler Is Nothing Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                ObjektMaus.Visible = True
                                Objektverwalter.Spielfeld.EingabenErlauben = True
                                AutoEndTurn()
                            End If
                        Else
                            ObjektMaus.Visible = True
                            Objektverwalter.Spielfeld.EingabenErlauben = True
                        End If
                    Else
                        ObjektMaus.Visible = False
                        Objektverwalter.Spielfeld.EingabenErlauben = False
                    End If
                    Max -= 1
                Else
                    I += 1
                End If
            Else

                If DataSettings._2D_3D_Malen Then
                    If Schlacht = Luftschlacht Then
                        Animationen(I).RemoveHandles()
                        Animationen(I) = Nothing
                        Animationen(I) = Animationen(Animationen.Length - 1)
                        Array.Resize(Animationen, Animationen.Length - 1)
                        If Animationen.Length = 0 Then
                            If Not Objektverwalter.Spielfeld.AktuellerSpieler Is Nothing Then
                                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                    ObjektMaus.Visible = True
                                    Objektverwalter.Spielfeld.EingabenErlauben = True
                                    AutoEndTurn()
                                End If
                            Else
                                ObjektMaus.Visible = True
                                Objektverwalter.Spielfeld.EingabenErlauben = True
                            End If
                        Else
                            ObjektMaus.Visible = False
                            Objektverwalter.Spielfeld.EingabenErlauben = False
                        End If
                        Max -= 1
                    Else
                        I += 1
                    End If
                Else
                    I += 1
                End If

            End If
        End While
    End Sub

    ''' <summary>
    ''' Erstellt die Sicht fuer KI und Mensch
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Sichterstellen(Optional ByVal ResetNebel As Boolean = False)
        If ObjektLadebildschirm.Ladebildschirm Is Nothing And Hauptmenue.Formmodus <> Hauptmenue.Formmodi.Editor Then
            If MenschlichesSichtfeld Is Nothing Then
                ReDim MenschlichesSichtfeld(Breite - 1, Hoehe - 1, Luftschlacht)
            End If

            If Regeln.LetzterMensch > 0 Then
                ObjektKI.CreateSicht(MenschlichesSichtfeld, Spieler(Regeln.LetzterMensch), True, ResetNebel)
            ElseIf AktuellerSpieler IsNot Nothing Then
                ObjektKI.CreateSicht(MenschlichesSichtfeld, Spieler(AktuellerSpieler.Spieler), True, ResetNebel)
            Else
                ObjektKI.CreateSicht(MenschlichesSichtfeld, Spieler(1), True, ResetNebel)
            End If
            If IsNothing(AktuellerSpieler) = False Then
                If Not AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    If IsNothing(CurrentAI) = False Then
                        ObjektKI.CreateSicht(CurrentAI.Sichtfeld, CurrentAI.Spieler)
                    End If
                End If
            End If
        End If
    End Sub
    Public Function IsPermanenteAufdeckung() As Boolean
        If Objektverwalter.Spielfeld.Regeln.Nebel = Nebelarten.Aufklaerungsnebel Then
            Return True
        Else
            Select Case GetCommanderWarsModus()
                Case CommanderWarsGameModi.AdvanceWarsDC, CommanderWarsGameModi.CommanderWars2
                    Return True
                Case Else
                    Return False
            End Select
        End If
    End Function

    Public Function GetGegner(ByVal Spielerarmee As ObjektSpieler) As Integer()
        Dim Feinde() As Integer = {}
        For I = 1 To Spieler.Length - 1
            If Regeln.Besiegt(I) = False Then
                If Not Spieler(I).Team = Spielerarmee.Team Then
                    Array.Resize(Feinde, Feinde.Length + 1)
                    Feinde(Feinde.Length - 1) = I
                End If
            End If
        Next
        Return Feinde
    End Function
    Public Function CountGegner(ByVal Spielerarmee As ObjektSpieler) As Integer
        Dim Feinde As Integer = 0
        For I = 1 To Spieler.Length - 1
            If Regeln.Besiegt(I) = False Then
                If Not Spieler(I).Team = Spielerarmee.Team Then
                    Feinde += 1
                End If
            End If
        Next
        Return Feinde
    End Function
#Region "Runden Ende"
    ''' <summary>
    ''' Wird aufgerufen, nachdem ein Spiel geladen wird.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub SpielWiederaufnehmen()
        If DataSettings.draw3D Then
            ObjektLadeklasse.Gebaeude3D.IniSpielerfarben(Spieler)
        End If

        For Each E In Einheiten
            If E IsNot Nothing Then
                If E.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                    Spieler(E.Spieler).KOS(0).SetKOEinheit(E)
                End If
            End If
        Next

        Anfangs3DIni()
        If AktuellerSpieler IsNot Nothing Then
            If Regeln.BauBlockade Then
                AktuellerSpieler.SpielerBaublockade = AktuellerSpieler.KOS(0).GetBaublockade(AktuellerSpieler.Spieler)
            End If
            'Wenn die KI drann ist, sollte sie erschaffen werden/ bzw. ziehen lassen.
            If AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
                If AktuellerSpieler.AI_Class Is Nothing Then
                    AktuellerSpieler.AI_Class = ObjektLadeklasse.NewKI(AktuellerSpieler)
                End If
                Objektverwalter.Spielfeld.CurrentAI = AktuellerSpieler.AI_Class
                Objektverwalter.Spielfeld.CurrentAI.LaunchAI()
            End If

        End If



        If DataSettings.Aufzeichnen Then
            'Wir sollen also eine Aufzeichnung machen.
            Hauptmenue.AufzeichnungStart(MapPosition, False)
        End If


        SetAutoResizeMapPosition()

        KameraPosBerechnen()
        Sichterstellen(True)

        If Game_Timer IsNot Nothing Then
            Regeln.Rundenzeit = Game_Timer(1).GetMaxTime
        End If
        If Game_Timer IsNot Nothing Then
            Game_Timer(AktuellerSpieler.Spieler).Timer_Pause()
        End If
    End Sub
    Public Sub SpielStart()
        IniCamera()
        CreateStartArea()
        If DataSettings.draw3D Then
            ObjektLadeklasse.Gebaeude3D.IniSpielerfarben(Spieler)
        End If

        If Regeln.Siegbedingung = "" Then
            Regeln.Siegbedingung = Sprachconverter.Translate("Besiege alle Gegner") + "."
        End If

        For I = 1 To Spieler.Length - 1
            'Gaben deaktivieren
            If Regeln.KeineGaben Then
                Spieler(I).Gabeleiste = False
            End If
        Next
        CommanderWarsModus = DataSettings.CommanderWarsGameModus
        'Aktueller Spieler festlegen!
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Geschlossen Then
            For I = AktuellerSpieler.Spieler + 1 To Spieler.Length - 1
                If Spieler(I).KIStufe <> ObjektSpieler.KIStufen.Geschlossen Then
                    AktuellerSpieler = Spieler(I)
                    Exit For
                ElseIf I = Spieler.Length - 1 Then
                    For I2 = 0 To AktuellerSpieler.Spieler - 1
                        If Spieler(I2).KIStufe <> ObjektSpieler.KIStufen.Geschlossen Then
                            AktuellerSpieler = Spieler(I2)
                            Exit For
                        End If
                    Next
                End If
            Next
        End If

        If DataSettings.Aufzeichnen Then
            If Not Hauptmenue.AufzeichnungAbspielen Then
                'Wir sollen also eine Aufzeichnung machen.
                Hauptmenue.AufzeichnungStart(MapPosition, True)
            End If
        End If

        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                For Y = 0 To Hoehe - 1
                    Dim E As ObjektEinheit = Einheiten(X, Y, I)
                    If IsNothing(E) = False Then
                        If E.GetSpieler.KIStufe = ObjektSpieler.KIStufen.Geschlossen Then
                            E = Nothing
                        Else
                            If E.Spieler = AktuellerSpieler.Spieler Then
                                E.HatsichBewegt = False
                            End If
                            If E.Munition > E.MunitionMax Then
                                E.Munition = E.MunitionMax
                            End If
                            'Kleines Update je nach Spiel-Version
                            If E.GetCWMunition > E.MunitionMax And E.MunitionMax > 0 Then
                                E.Munition = E.MunitionMax
                            End If
                            'KO Einheiten setzen!
                            If E.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                                Select Case CommanderWarsModus
                                    Case CommanderWarsGameModi.AdvanceWarsDC, CommanderWarsGameModi.CommanderWars2
                                        Spieler(E.Spieler).KOS(0).SetKOEinheit(E)
                                    Case Else
                                        E.EinheitenStufe = ObjektEinheit.Stufe.Veteran
                                End Select
                            End If

                            If E.Treibstoff > E.SpritMax Then
                                E.Treibstoff = E.SpritMax
                            End If
                            E.BildIDbestimmen()
                        End If
                    End If
                    Dim G As ObjektGebaeude = Landschaften(X, Y, I).Gebaeude
                    If IsNothing(G) = False Then
                        If G.GetSpieler.KIStufe = ObjektSpieler.KIStufen.Geschlossen Then
                            G.Spieler = 0
                        End If
                        G.getBildID(Me)
                    End If
                Next
            Next
        Next
        Regeln.MenschenZaehlen()
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Regeln.LetzterMensch = AktuellerSpieler.Spieler
        ElseIf Regeln.LetzterMensch <= 0 Then
            For I = AktuellerSpieler.Spieler - 1 To 1 Step -1
                If Spieler(I).KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Regeln.LetzterMensch = I
                    Exit For
                End If
            Next
            If Regeln.LetzterMensch <= 0 Then
                For I = Spieler.Length - 1 To AktuellerSpieler.Spieler + 1 Step -1
                    If Spieler(I).KIStufe = ObjektSpieler.KIStufen.Mensch Then
                        Regeln.LetzterMensch = I
                        Exit For
                    End If
                Next
            End If
            If Regeln.LetzterMensch <= 0 Then
                Regeln.LetzterMensch = 0
            End If
        End If

        MomentaneSchlacht = Bodenschlacht
        Regeln.SindBesiegbar()
        KOAnzeigen = New ObjektKOAnzeigen()
        InfoAnzeige = New ObjektInfoAnzeige()
        Aufzeichnung = New ObjektAufzeichnungen(AktuellerSpieler.Spieler)
        ObjektScript.Scripts = Scripts

        If Hauptmenue.Connection IsNot Nothing Then
            If Hauptmenue.Connection.Connected Then
                'Wir starten das Spiel besser erst, wenn auch alle anderen Spieler soweit sind.
                Hauptmenue.NetzBefehlSenden(Net_Orders.Player_Ready) 'Also wir sind bereit.
                Dim Fortfahren As Boolean = False
                Do Until Fortfahren
                    Fortfahren = True
                    If Not Hauptmenue.Connection.IsGameReady Then
                        Fortfahren = False
                    End If
                    Threading.Thread.Sleep(100) 'Solange, bis die anderen Spieler soweit sind, koennen wir uns auf's Ohr hauen :)
                Loop
            End If
        End If
        Anfangs3DIni()

        RundenAnfangStart()
        SetAutoResizeMapPosition()
        ReDim Game_Timer(Spieler.Length - 1)
        For I = 0 To Spieler.Length - 1
            Game_Timer(I) = New Timer(Regeln.Rundenzeit, Regeln.Timermode)
        Next
    End Sub
    ''' <summary>
    ''' Versteck alles ausserdem Startrechteck
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub CreateStartArea()
        'Startspielfeld erstellen.
        If StartRechteck.Width <> 0 And StartRechteck.Height <> 0 Then
            For X = 0 To StartRechteck.X - 1
                For Y = 0 To Hoehe - 1
                    Landschaften(X, Y, 0).Hidden = True
                    Landschaften(X, Y, 1).Hidden = True
                Next
            Next
            For X = StartRechteck.Width To Breite - 1
                For Y = 0 To Hoehe - 1
                    Landschaften(X, Y, 0).Hidden = True
                    Landschaften(X, Y, 1).Hidden = True
                Next
            Next
            For Y = 0 To StartRechteck.Y - 1
                For X = 0 To Breite - 1
                    Landschaften(X, Y, 0).Hidden = True
                    Landschaften(X, Y, 1).Hidden = True
                Next
            Next
            For Y = StartRechteck.Height To Hoehe - 1
                For X = 0 To Breite - 1
                    Landschaften(X, Y, 0).Hidden = True
                    Landschaften(X, Y, 1).Hidden = True
                Next
            Next
        End If
    End Sub
    ''' <summary>
    ''' Die Runde ist Beendet.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RundenEnde(Optional ByVal Send As Boolean = True)
        'Wir erneuern alle Werte
        Objektverwalter.Spielfeld.EingabenErlauben = False
        'Die KI ist Fertig
        If CurrentAI IsNot Nothing Then
            CurrentAI.DisposeAI()
            If CurrentAI.KIThreat IsNot Nothing Then
                CurrentAI.KIThreat.Abort()
            End If
        End If
        CurrentAI = Nothing

        'Wolken bewegen sich irgendwo hin
        WolkenBewegen()
        'Wenn eine Runde zu Ende geht, sollten die Scripts geprueft werden.
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenEnde)


        If MomentaneSchlacht = Luftschlacht Then
            'Damit wir immer auf der Bodenschlacht starten.
            SchlachtWechseln(False)
        End If

        'Kommt ab und zu bei der KI vor kleiner Bug keine Ahnnung warum
        If IsNothing(AktuelleEinheit) = False Then
            Objektverwalter.Einheitabwaehlen(True)
        End If
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        Objektverwalter.Spielfeld.SpielfeldLocker.Lock()
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                For Y = 0 To Hoehe - 1
                    If Not Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Einheiten(X, Y, I)) = False Then
                            If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X, Y, I).HatsichBewegt = False And AktuellerSpieler.KOS(0).FeldtarnungsReichweite >= 0 Then
                                    If AktuellerSpieler.KOS(0).KOBoostApply(X, Y) Then
                                        Einheiten(X, Y, I).SetFeldtarnung(True)
                                    End If
                                End If
                                'Die Werte werden zurueckgesetzt
                                Einheiten(X, Y, I).HatsichBewegt = False
                                If AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                                    'Den Treibstoff uebermitteln!
                                    Hauptmenue.NetzBefehlSenden(X, Y, I, Einheiten(X, Y, I).Treibstoff)
                                End If
                            End If
                        End If
                        If IsNothing(Landschaften(X, Y, I).Gebaeude) = False Then
                            If Landschaften(X, Y, I).Gebaeude.Spieler = AktuellerSpieler.Spieler Then
                                'Manche KOS senken die Beszahl fuer eine Runde. Die wird jetzt wieder normalisiert
                                If Landschaften(X, Y, I).Gebaeude.Besetzung > 0 Then
                                    If Einheiten(X, Y, I) Is Nothing Then
                                        Landschaften(X, Y, I).Gebaeude.Besetzung = ObjektGebaeude.Besetzungszahl
                                    Else
                                        If Einheiten(X, Y, I).Besetzen = False Then
                                            Landschaften(X, Y, I).Gebaeude.Besetzung = ObjektGebaeude.Besetzungszahl
                                        End If
                                    End If
                                End If
                                If Landschaften(X, Y, I).Gebaeude.GebaeudeID = "STADT" Then
                                    Dim G As GebaeudeStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                                    G.KannBauen = False
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Objektverwalter.Spielfeld.SpielfeldLocker.Unlock()
        'Hat der Spieler Doppel-Gabe eingesetzt und noch nicht gewechselt?
        If IsNothing(AktuellerSpieler.KOS(1)) = False Then
            If AktuellerSpieler.KOS(1).Gabemodus = ObjektKO.Gabemodi.Doppelgabe And AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                AktuellerSpieler.KOS(0).Doppelgabe()
                KOAnzeigen.KOAnzeigeerstellen()
                If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Objektverwalter.Spielfeld.EingabenErlauben = True
                    Exit Sub
                Else
                    'Ha die KI ist noch mal dran
                    CurrentAI.LaunchAI()
                    Exit Sub
                End If
            End If
        End If

        If DataSettings.KonsolenSpielBefehle Then
            Konsole.Write("Next Player turn.")
        End If

        'jetzt werden die Werte resetet
        AktuellerSpieler.SpielerFrameRundenEnde()
        Aufzeichnung.UpdateAufzeichnungen(False)
        Dim Pause As Boolean = False
        Dim NaechsterSpieler As Integer = AktuellerSpieler.Spieler
        While Pause = False
            NaechsterSpieler += 1
            If NaechsterSpieler > Spieler.Length - 1 Then
                'Ein Tag ist vergangen
                MomentaneSchlacht = 0
                Runde = 1
                NaechsterSpieler = 1
            End If
            If Regeln.Besiegt(NaechsterSpieler) = False Then
                AktuellerSpieler = Spieler(NaechsterSpieler)
                Pause = True
                RundenAnfangStart()
            Else
                Pause = False
            End If
        End While
        If Game_Timer IsNot Nothing Then
            Game_Timer(AktuellerSpieler.Spieler).Timer_Pause()
        End If
    End Sub
    ''' <summary>
    ''' Die Runde faengt an, der Splash screen wird gezeigt.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RundenAnfangStart()
        If Objektverwalter.EinheitenMenue IsNot Nothing Then
            Hauptmenue.CursorPlazieren(Objektverwalter.EinheitenMenue.Feldpunkt.X * Hauptmenue.Feldbreite, Objektverwalter.EinheitenMenue.Feldpunkt.Y * Hauptmenue.Feldbreite)
            Objektverwalter.EinheitenMenue.Dispose()
            Objektverwalter.EinheitenMenue = Nothing
        End If
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Objektverwalter.Spielfeld.EingabenErlauben = True
        Else
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        For Each Kommandeur In AktuellerSpieler.KOS
            If IsNothing(Kommandeur) = False Then
                Kommandeur.Gabezuruecksetzen()
            End If
        Next

        MusikEngine.MusikStop()
        RundenAnfangAnzeige = New RundenAnfangBild()

        Grafikengine.Lichtaendern(AktuellerSpieler.KOS(0).getLichtfarbe)
    End Sub
    ''' <summary>
    ''' Die wirkliche Runde faengt an der Splash screen ist weg.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RundenAnfang()
        RundenAnfangAnzeige = Nothing
        ObjektMaus.Visible = False

        ' ObjektScript.NeuScript("TestScript")
        'Die Scripts muessen geprueft werden.
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenAnfang)


        AktuellerSpieler.KOS(0).PlayGabeFuellMusik()
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Regeln.LetzterMensch = AktuellerSpieler.Spieler
        ElseIf Regeln.LetzterMensch <= 0 Then
            Regeln.LetzterMensch = AktuellerSpieler.Spieler
        ElseIf Spieler(Regeln.LetzterMensch).KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            Regeln.LetzterMensch = AktuellerSpieler.Spieler
        End If
        If KOAnzeigen Is Nothing Then
            KOAnzeigen = New ObjektKOAnzeigen()
        Else
            KOAnzeigen.KOAnzeigeerstellen()
        End If

        'Der Spieler bekommt sein Geld
        AktuellerSpieler.EarnMoney()

        AktuellerSpieler.SpielerFrameRundenAnfang()
        'Der Spieler kann alle blockierte Felder wieder betreten
        'Einheiten werden repariert, Treibstoff verbraucht, Einheiten versenkt, und 
        Dim WarteZeit As Integer = 4
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                For Y = 0 To Hoehe - 1
                    If Not Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Einheiten(X, Y, I)) = False Then
                            If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                                Einheiten(X, Y, I).ResetWerte()
                                'Reset Position
                                Einheiten(X, Y, I).X = X
                                Einheiten(X, Y, I).Y = Y
                                Einheiten(X, Y, I).Battlemap = I
                                Dim Treibstoffverbauch As Integer = Einheiten(X, Y, I).Treibstoffverbrauch - Einheiten(X, Y, I).TreibstoffSenkung
                                If Einheiten(X, Y, I).Bewegungsart = "See" Or Einheiten(X, Y, I).Bewegungsart = MovementSorts.Transport.ToString Then
                                    Treibstoffverbauch -= Spieler(Einheiten(X, Y, I).Spieler).KOS(0).SpritsenkungSee * Spieler(Einheiten(X, Y, I).Spieler).KOS(0).GetKOZoneBoost(Einheiten(X, Y, I))
                                ElseIf Einheiten(X, Y, I).Bewegungsart = MovementSorts.Flugzeug.ToString Or Einheiten(X, Y, I).Bewegungsart = MovementSorts.Helikopter.ToString Then
                                    Treibstoffverbauch -= Spieler(Einheiten(X, Y, I).Spieler).KOS(0).SpritsenkungLuft * Spieler(Einheiten(X, Y, I).Spieler).KOS(0).GetKOZoneBoost(Einheiten(X, Y, I))
                                End If
                                If Treibstoffverbauch < 0 Then
                                    Treibstoffverbauch = 0
                                End If
                                Einheiten(X, Y, I).Sprit -= Treibstoffverbauch

                                If Einheiten(X, Y, I).IsGetaucht = True Then
                                    Einheiten(X, Y, I).Sprit -= 4
                                End If

                                'Einheiten in Transportern bekommen immer Ration
                                If Einheiten(X, Y, I).Ladung.Length > 0 Then
                                    For Each Einheit In Einheiten(X, Y, I).Ladung
                                        If Not Einheit Is Nothing Then
                                            Einheit.Treibstoff = Einheit.SpritMax
                                            Einheit.Munition = Einheit.MunitionMax
                                            Select Case DataSettings.CommanderWarsGameModus
                                                Case CommanderWarsGameModi.CommanderWars2
                                                    Einheit.HatsichBewegt = False
                                                Case CommanderWarsGameModi.CommanderWars
                                                    Einheit.HatsichBewegt = False
                                                Case Else
                                                    Einheit.HatsichBewegt = True
                                            End Select
                                        End If
                                    Next
                                End If
                            End If
                            'Falls der KO Rationen verteilen kann tut er das jetzt.
                            If AktuellerSpieler.VeraenderteWerte.KeineVersorgung.X = 0 Then
                                If IsNothing(Landschaften(X, Y, I).Gebaeude) = False And Einheiten(X, Y, I).KannReapariertWerden = True Then
                                    'Dort steht ein Gebaeude
                                    If AktuellerSpieler.IsReperaturGebaeude(Landschaften(X, Y, I).Gebaeude.GetSpieler) = True Then
                                        'Das Gebaeude gehoert dem Spieler
                                        If Landschaften(X, Y, I).Gebaeude.Versorung = True Then
                                            'Nun bekommt die Einheit evtl. Ration
                                            Dim Bauliste() As String = {}
                                            If Landschaften(X, Y, 0).Gebaeude.GetBauliste.Length > 0 Then
                                                Bauliste = Landschaften(X, Y, I).Gebaeude.GetBauliste
                                            Else
                                                Bauliste = ObjektLadeklasse.GetBauliste("Basis")
                                            End If
                                            If FindElement(Bauliste, Einheiten(X, Y, I).EinheitenID) >= 0 Then
                                                If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                                                    Dim Heilung As Integer = 1
                                                    If AktuellerSpieler.KOS(0).GebaeudeHeilung <> 2 Then
                                                        Heilung = (AktuellerSpieler.KOS(0).GebaeudeHeilung - 1) * AktuellerSpieler.KOS(0).GetKOZoneBoost(X, Y)
                                                    End If
                                                    For I2 = 0 To Heilung
                                                        Objektverwalter.Heilen(Einheiten(X, Y, I))
                                                    Next
                                                    Objektverwalter.Ration(X, Y, True, WarteZeit, I)
                                                    Objektverwalter.ZuFeldgehen(X, Y)
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                                If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                                    If Einheiten(X, Y, I).Faehigkeit = "Ration" Then
                                        AktuelleEinheit = Einheiten(X, Y, I)
                                        AktuelleEinheitPosition = New Point(X, Y)
                                        Objektverwalter.Ration(True, WarteZeit, I)
                                        AktuelleEinheit = Nothing
                                        AktuelleEinheitPosition = New Point(0, 0)
                                        Objektverwalter.ZuFeldgehen(X, Y)
                                    End If
                                End If
                            End If

                        End If
                        'Jetzt kommen Gebaeude dran auf denen keine Einheit steht
                        If IsNothing(Landschaften(X, Y, I).Gebaeude) = False Then
                            'Dort steht ein Gebaeude
                            If Landschaften(X, Y, I).Gebaeude.Spieler = AktuellerSpieler.Spieler Then
                                'Das Gebaeude gehoert dem Spieler
                                'Das Gebaeude darf einen Frame machen und seine Werte aktualisieren.
                                Landschaften(X, Y, I).Gebaeude.DOSpielFrame()
                            ElseIf AktuellerSpieler.Spieler = Regeln.GetFirstPlayer Then
                                If Landschaften(X, Y, I).Gebaeude.Spieler = 0 Then
                                    'Das ist ein neutrales Gebaeude
                                    If Landschaften(X, Y, I).Gebaeude.Angriff = ObjektGebaeude.Angriffe.Vulkan Then
                                        'Es ist ein Vulkan Feuerfrei im warsten Sinne des Satzes
                                        Landschaften(X, Y, I).Gebaeude.Feuer(0, 0)
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                For Y = 0 To Hoehe - 1
                    If Not Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Einheiten(X, Y, I)) = False Then
                            If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                                'Wenn die Einheit jetzt weniger als Null Treibstoff hat Boom
                                If Einheiten(X, Y, I).Treibstoff < 0 Then
                                    If Einheiten(X, Y, I).SpritMax > 0 Then
                                        Objektverwalter.NeuObjektAnimation(X, Y)
                                    End If
                                End If
                                If DataSettings.CommanderWarsGameModus = CommanderWarsGameModi.CommanderWars2 Then
                                    'Einheiten(X, Y, I).EinheitenEffekt()'Depreced
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next

        If Regeln.BauBlockade Then
            AktuellerSpieler.SpielerBaublockade = AktuellerSpieler.KOS(0).GetBaublockade(AktuellerSpieler.Spieler)
        End If

        Regeln.WetterAendern()

        Sichterstellen(True)

        Aufzeichnung.UpdateAufzeichnungen(True)

        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        If Not M.Spielmodus = ObjektSpielMenue.Spielmodi.KOSprechen Then
            M.Spielmodus = ObjektSpielMenue.Spielmodi.Nichts
        End If
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = True
            Objektverwalter.Spielfeld.EingabenErlauben = True
        Else
            If AktuellerSpieler.AI_Class Is Nothing Then
                AktuellerSpieler.AI_Class = ObjektLadeklasse.NewKI(AktuellerSpieler)
            End If
            CurrentAI = AktuellerSpieler.AI_Class
            CurrentAI.LaunchAI()
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        Game_Timer(AktuellerSpieler.Spieler).Timer_Start()
    End Sub

    Public Sub WolkenBewegen()
        If Hauptmenue.Connection.Hosten = False And Hauptmenue.Connection.Connected Then Exit Sub
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
            'wir machen das hier nur wenn es eine Luftschlacht gibt
            For X = 0 To Breite - 1
                For Y = 0 To Hoehe - 1
                    If Landschaften(X, Y, Luftschlacht).getID = "WOLKEN" Then
                        If Landschaften(X, Y, Luftschlacht).GetSpielerWolken = AktuellerSpieler.Spieler Then
                            If Zufallszahl(0, 2) = 0 Then 'Mal schauen wie oft wir das tatsaechlich machen.
                                Dim Zahl As Integer = Zufallszahl(0, 4)
                                Dim Richtung As Integer = Landschaften(X, Y, Luftschlacht).Bewegungsrichtung
                                If Zahl <= 1 Then
                                    'wir bewegen uns in eine zufaellige Richtung 40%
                                    Richtung = Zufallszahl(0, 4)
                                Else
                                    'wir bewegen uns in die richtung weiter 60%
                                End If
                                Dim neuX, neuY As Integer
                                Select Case Richtung
                                    Case 1 'Norden
                                        neuX = X
                                        neuY = Y - 1
                                    Case 2 'Osten
                                        neuX = X + 1
                                        neuY = Y
                                    Case 3 'Sueden
                                        neuX = X
                                        neuY = Y + 1
                                    Case 4 'Westen
                                        neuX = X - 1
                                        neuY = Y
                                    Case Else 'Stehen Bleiben
                                        neuX = X
                                        neuY = Y
                                End Select
                                If OnMap(neuX, neuY) Then
                                    If Landschaften(neuX, neuY, Luftschlacht).getID = "LUFT" Then
                                        Hauptmenue.NetzBefehlSendenWolkenBewegen(X, Y, neuX, neuY)
                                        Dim LandschaftAlt As ObjektLandschaft = Landschaften(neuX, neuY, Luftschlacht)
                                        Landschaften(neuX, neuY, Luftschlacht) = Landschaften(X, Y, Luftschlacht)
                                        Landschaften(X, Y, Luftschlacht) = LandschaftAlt

                                        'Sichtbarkeit uebertragen...
                                        Landschaften(X, Y, Luftschlacht).Hidden = Landschaften(neuX, neuY, Luftschlacht).Hidden
                                        Landschaften(neuX, neuY, Luftschlacht).Hidden = LandschaftAlt.Hidden

                                        Dim Spieler As Integer = 0
                                        Do
                                            Spieler = Zufallszahl(1, Me.Spieler.Length - 1)
                                        Loop While Spieler = Landschaften(neuX, neuY, Luftschlacht).GetSpielerWolken
                                        Landschaften(neuX, neuY, Luftschlacht).SetSpielerWolken(Spieler)
                                        Landschaften(neuX, neuY, Luftschlacht).Bewegungsrichtung = Richtung
                                    Else
                                        Landschaften(X, Y, Luftschlacht).SetSpielerWolken(Zufallszahl(1, Spieler.Length - 1))
                                    End If
                                Else
                                    Landschaften(X, Y, Luftschlacht).SetSpielerWolken(Zufallszahl(1, Spieler.Length - 1))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
    End Sub
    Public Sub WolkenBewegen(ByVal X As Integer, ByVal Y As Integer, ByVal neuX As Integer, ByVal neuY As Integer)
        Dim LandschaftAlt As ObjektLandschaft = Landschaften(neuX, neuY, Luftschlacht)
        Landschaften(neuX, neuY, Luftschlacht) = Landschaften(X, Y, Luftschlacht)
        Landschaften(X, Y, Luftschlacht) = LandschaftAlt
    End Sub
    Private Sub Anfangs3DIni()
        'Ein schoenes Lichterspiel:
        If Regeln.Nebel = Nebelarten.Aus Or Not DataSettings.Kriegsnebel3D Then
            'Das standardlicht, was kaum rechenkraft verbraucht.
            Grafikengine.LichtartAendern(False)
        Else
            Grafikengine.LichtartAendern(True)
        End If
        Wetter3D = Partikelklasse.CreateWetter(Breite, Hoehe, Regeln.Wetter)

    End Sub
#End Region

    Public Sub NaechsteEinheit()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        Select Case M.Spielmodus
            Case ObjektSpielMenue.Spielmodi.Nichts
                Dim X As Integer = Hauptmenue.SpielfeldPunkt.X
                Dim Y As Integer = Hauptmenue.SpielfeldPunkt.Y
                Dim Start As Boolean = False
                If Y >= Hoehe Or Y < 0 Then
                    Y = 0
                End If
                If X >= Breite Then
                    X = 0
                    If Y + 1 < Hoehe Then
                        Y += 1
                    Else
                        Y = 0
                    End If
                ElseIf X < 0 Then
                    X = 0
                End If
                For Y1 = 0 To Hoehe - 1
                    For X1 = 0 To Breite - 1
                        If Start = False Then
                            X1 = X + 1
                            Y1 = Y
                            If X1 + 1 >= Breite Then
                                X1 = 0
                                If Y1 + 1 >= Hoehe Then
                                    Y1 = 0
                                End If
                            End If
                            Start = True
                        End If
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                            If Einheiten(X1, Y1, MomentaneSchlacht).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X1, Y1, MomentaneSchlacht).HatsichBewegt = False Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenue.CursorPlazieren(X1 * Hauptmenue.Feldbreite, Y1 * Hauptmenue.Feldbreite)
                                    MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                    Next
                Next
                For Y1 = 0 To Y
                    For X1 = 0 To Breite - 1
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                            If Einheiten(X1, Y1, MomentaneSchlacht).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X1, Y1, MomentaneSchlacht).HatsichBewegt = False Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenue.CursorPlazieren(X1 * Hauptmenue.Feldbreite, Y1 * Hauptmenue.Feldbreite)
                                    MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                        If X1 = X And Y1 = Y Then
                            Exit For
                        End If
                    Next
                Next
                Start = False
                'Wir gehen die Baugebaeude durch.
                For Y1 = 0 To Hoehe - 1
                    For X1 = 0 To Breite - 1
                        If Start = False Then
                            X1 = X + 1
                            Y1 = Y
                            If X1 + 1 >= Breite Then
                                X1 = 0
                                If Y1 + 1 >= Hoehe Then
                                    Y1 = 0
                                End If
                            End If
                            Start = True
                        End If
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                        ElseIf IsNothing(Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude) = False Then
                            If Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.Spieler = AktuellerSpieler.Spieler Then
                                If Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.GetBaulisteThisPlayer.Length > 0 Or Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.Feuerbereit = 0 And Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.GetRealGebaeudeID <> "VERWEIS" Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenue.CursorPlazieren(X1 * Hauptmenue.Feldbreite, Y1 * Hauptmenue.Feldbreite)
                                    MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                    Next
                Next
                For Y1 = 0 To Y
                    For X1 = 0 To Breite - 1
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                        ElseIf IsNothing(Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude) = False Then
                            If Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.Spieler = AktuellerSpieler.Spieler Then
                                If Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.GetBaulisteThisPlayer.Length > 0 Or Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.Feuerbereit = 0 And Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.GetRealGebaeudeID <> "VERWEIS" Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenue.CursorPlazieren(X1 * Hauptmenue.Feldbreite, Y1 * Hauptmenue.Feldbreite)
                                    MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                        If X1 = X And Y1 = Y Then
                            Exit Sub
                        End If
                    Next
                Next
            Case ObjektSpielMenue.Spielmodi.Angriff
                NaechstesMarkiertesFeld()
            Case ObjektSpielMenue.Spielmodi.Entladen
                NaechstesMarkiertesFeld()
            Case ObjektSpielMenue.Spielmodi.GebaeudeSchuss
                NaechstesMarkiertesFeld()
            Case ObjektSpielMenue.Spielmodi.Reparieren
                NaechstesMarkiertesFeld()
        End Select
    End Sub
    Public Sub LetzteEinheit()
        Dim M As ObjektSpielMenue = Objektverwalter.Menue
        Select Case M.Spielmodus
            Case ObjektSpielMenue.Spielmodi.Nichts
                Dim X As Integer = Hauptmenue.SpielfeldPunkt.X
                Dim Y As Integer = Hauptmenue.SpielfeldPunkt.Y
                Dim Start As Boolean = False
                If Y >= Hoehe Or Y < 0 Then
                    Y = 0
                End If
                If X >= Breite Then
                    X = 0
                    Y += 1
                ElseIf X < 0 Then
                    X = 0
                End If
                For Y1 = Hoehe - 1 To 0 Step -1
                    For X1 = Breite - 1 To 0 Step -1
                        If Start = False Then
                            X1 = X - 1
                            Y1 = Y
                            If X1 < 0 Then
                                X1 = 0
                                Y1 -= 1
                                If Y1 < 0 Then
                                    Y1 = Hoehe - 1
                                End If
                            End If
                            Start = True
                        End If
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                            If Einheiten(X1, Y1, MomentaneSchlacht).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X1, Y1, MomentaneSchlacht).HatsichBewegt = False Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenue.CursorPlazieren(X1 * Hauptmenue.Feldbreite, Y1 * Hauptmenue.Feldbreite)
                                    MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                    Next
                Next
                For Y1 = Hoehe - 1 To Y Step -1
                    For X1 = Breite - 1 To 0 Step -1
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                            If Einheiten(X1, Y1, MomentaneSchlacht).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X1, Y1, MomentaneSchlacht).HatsichBewegt = False Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenue.CursorPlazieren(X1 * Hauptmenue.Feldbreite, Y1 * Hauptmenue.Feldbreite)
                                    MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                        If X1 = X And Y1 = Y Then
                            Exit For
                        End If
                    Next
                Next
                Start = False
                'Wir gehen die Baugebaeude durch.
                For Y1 = Hoehe - 1 To 0 Step -1
                    For X1 = Breite - 1 To 0 Step -1
                        If Start = False Then
                            X1 = X - 1
                            Y1 = Y
                            If X1 < 0 Then
                                X1 = 0
                                Y1 -= 1
                                If Y1 < 0 Then
                                    Y1 = Hoehe - 1
                                End If
                            End If
                            Start = True
                        End If
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                        ElseIf IsNothing(Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude) = False Then
                            If Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.Spieler = AktuellerSpieler.Spieler Then
                                If Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.GetBaulisteThisPlayer.Length > 0 Or Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.Feuerbereit = 0 And Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.GetRealGebaeudeID <> "VERWEIS" Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenue.CursorPlazieren(X1 * Hauptmenue.Feldbreite, Y1 * Hauptmenue.Feldbreite)
                                    MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                    Next
                Next
                For Y1 = Hoehe - 1 To Y Step -1
                    For X1 = Breite - 1 To 0 Step -1
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                        ElseIf IsNothing(Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude) = False Then
                            If Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.Spieler = AktuellerSpieler.Spieler Then
                                If Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.GetBaulisteThisPlayer.Length > 0 Or Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.Feuerbereit = 0 And Landschaften(X1, Y1, MomentaneSchlacht).Gebaeude.GetRealGebaeudeID <> "VERWEIS" Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenue.CursorPlazieren(X1 * Hauptmenue.Feldbreite, Y1 * Hauptmenue.Feldbreite)
                                    MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                        If X1 = X And Y1 = Y Then
                            Exit Sub
                        End If
                    Next
                Next
            Case ObjektSpielMenue.Spielmodi.Angriff
                NaechstesMarkiertesFeld()
            Case ObjektSpielMenue.Spielmodi.Entladen
                NaechstesMarkiertesFeld()
            Case ObjektSpielMenue.Spielmodi.GebaeudeSchuss
                NaechstesMarkiertesFeld()
            Case ObjektSpielMenue.Spielmodi.Reparieren
                NaechstesMarkiertesFeld()
        End Select
    End Sub

    Private Sub NaechstesMarkiertesFeld()
        For I = 0 To Objektverwalter.MarkierteFelder.Count - 1
            If Objektverwalter.MarkierteFelder(I).X = Hauptmenue.SpielfeldPunkt.X Then
                If Objektverwalter.MarkierteFelder(I).Y = Hauptmenue.SpielfeldPunkt.Y Then
                    If I + 1 >= Objektverwalter.MarkierteFelder.Count Then
                        I = 0
                    Else
                        I += 1
                    End If
                    Hauptmenue.CursorPlazieren(Objektverwalter.MarkierteFelder(I).X * Hauptmenue.Feldbreite, Objektverwalter.MarkierteFelder(I).Y * Hauptmenue.Feldbreite)
                    Exit Sub
                End If
            End If
        Next
        Hauptmenue.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenue.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenue.Feldbreite)
    End Sub
    ''' <summary>
    ''' Ueberprueft ob das Feld auf dem Spielfeld ist.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="IgnoreHide">Should only be used by ObjectScript</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function OnMap(ByVal X As Integer, ByVal Y As Integer, Optional ByVal IgnoreHide As Boolean = False) As Boolean
        If X >= 0 Then
            If Y >= 0 Then
                If X < Breite Then
                    If Y < Hoehe Then
                        If Not Objektverwalter.Spielfeld.Landschaften(X, Y, MomentaneSchlacht).Hidden Or IgnoreHide Then
                            Return True
                        End If
                    End If
                End If
            End If
        End If
        Return False
    End Function
    Public Function OnMap(ByVal P As Point) As Boolean
        Return OnMap(P.X, P.Y)
    End Function

    ''' <summary>
    ''' Plaziert eine Einheit auf das naeheste Gelaende von diesem Feld aus, welches Begehbar ist.
    ''' </summary>
    ''' <param name="Unit"></param>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Sub PlaceUnit(ByVal Unit As ObjektEinheit, ByVal X As Integer, ByVal Y As Integer, ByVal Schlachtfeld As Integer)
        If OnMap(X, Y) Then
            If Unit.CanMoveOverTile(X, Y, Schlachtfeld) = True And Einheiten(X, Y, Schlachtfeld) Is Nothing Then
                Unit.X = X
                Unit.Y = Y
                Einheiten(X, Y, Schlachtfeld) = Unit
                Exit Sub
            End If
        End If
        Dim MomentanterRadius As Integer = 0
        Dim X2 As Integer = 0
        Dim Y2 As Integer = 0
        Dim Gefunden As Boolean = False
        Dim Modus As Integer = 0
        While Gefunden = False
            If Modus = 0 Then
                MomentanterRadius += 1
                X2 = MomentanterRadius
                Y2 = 0
            End If
            For I = 1 To MomentanterRadius
                X2 += 1
                Y2 += 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Unit.CanMoveOverTile(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing Then
                        Unit.X = X + X2 - MomentanterRadius
                        Unit.Y = Y + Y2 - MomentanterRadius
                        Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = Unit
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 -= 1
                Y2 += 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Unit.CanMoveOverTile(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing Then
                        Unit.X = X + X2 - MomentanterRadius
                        Unit.Y = Y + Y2 - MomentanterRadius
                        Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = Unit
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 -= 1
                Y2 -= 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Unit.CanMoveOverTile(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing Then
                        Unit.X = X + X2 - MomentanterRadius
                        Unit.Y = Y + Y2 - MomentanterRadius
                        Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = Unit
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 += 1
                Y2 -= 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Unit.CanMoveOverTile(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing Then
                        Unit.X = X + X2 - MomentanterRadius
                        Unit.Y = Y + Y2 - MomentanterRadius
                        Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = Unit
                        Exit Sub
                    End If
                End If
            Next

            If MomentanterRadius > Objektverwalter.Spielfeld.Breite And MomentanterRadius > Objektverwalter.Spielfeld.Hoehe Then
                'wir finden kein Terrain.
                Exit While
            End If
        End While
    End Sub
    ''' <summary>
    ''' Plaziert ein kleines Gebaeude auf das naeheste Gelaende von diesem Feld aus, welches Begehbar ist.
    ''' </summary>
    ''' <param name="Gebaeude"></param>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Sub PlaceBuilding(ByVal Gebaeude As ObjektGebaeude, ByVal X As Integer, ByVal Y As Integer, ByVal Schlachtfeld As Integer)
        If Gebaeude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).getID) = True And Einheiten(X, Y, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebaeude Is Nothing Then
            Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebaeude = ObjektLadeklasse.NewGebaeude(Gebaeude.GebaeudeID, Gebaeude.Spieler, X, Y, Schlachtfeld, Objektverwalter.Spielfeld)
            Exit Sub
        End If
        Dim MomentanterRadius As Integer = 0
        Dim X2 As Integer = 0
        Dim Y2 As Integer = 0
        Dim Gefunden As Boolean = False
        Dim Modus As Integer = 0
        While Gefunden = False
            If Modus = 0 Then
                MomentanterRadius += 1
                X2 = MomentanterRadius
                Y2 = 0
            End If
            For I = 1 To MomentanterRadius
                X2 += 1
                Y2 += 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Gebaeude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).getID) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebaeude Is Nothing Then
                        Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebaeude = ObjektLadeklasse.NewGebaeude(Gebaeude.GebaeudeID, Gebaeude.Spieler, X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld, Objektverwalter.Spielfeld)
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 -= 1
                Y2 += 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Gebaeude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).getID) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebaeude Is Nothing Then
                        Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebaeude = ObjektLadeklasse.NewGebaeude(Gebaeude.GebaeudeID, Gebaeude.Spieler, X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld, Objektverwalter.Spielfeld)
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 -= 1
                Y2 -= 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Gebaeude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).getID) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebaeude Is Nothing Then
                        Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebaeude = ObjektLadeklasse.NewGebaeude(Gebaeude.GebaeudeID, Gebaeude.Spieler, X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld, Objektverwalter.Spielfeld)
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 += 1
                Y2 -= 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Gebaeude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).getID) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebaeude Is Nothing Then
                        Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebaeude = ObjektLadeklasse.NewGebaeude(Gebaeude.GebaeudeID, Gebaeude.Spieler, X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld, Objektverwalter.Spielfeld)
                        Exit Sub
                    End If
                End If
            Next

            If MomentanterRadius > Objektverwalter.Spielfeld.Breite And MomentanterRadius > Objektverwalter.Spielfeld.Hoehe Then
                'wir finden kein Terrain.
                Exit While
            End If
        End While
    End Sub

    Public Sub SchlachtWechseln(Optional ByVal Senden As Boolean = True)
        If Objektverwalter.Spielfeld.AktuellerSpieler IsNot Nothing Then
            If Senden Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                    Hauptmenue.NetzBefehlSendenSchlachtfeldWechsel(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler)
                End If
            End If
        End If
        'Das muesste reichen um die Schlacht zu wechseln
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
            If Objektverwalter.Spielfeld.MomentaneSchlacht = ObjektSpielfeld.Bodenschlacht Then
                Objektverwalter.Spielfeld.MomentaneSchlacht = ObjektSpielfeld.Luftschlacht
            Else
                Objektverwalter.Spielfeld.MomentaneSchlacht = ObjektSpielfeld.Bodenschlacht
            End If

            'Wir erstellen die Sicht.
            Sichterstellen()
        End If
    End Sub
    Public Function GetSpielgroesse() As Integer
        Return Breite * Hoehe
    End Function
    Public Function GetCommanderWarsModus() As CommanderWarsGameModi
        Return CommanderWarsModus
    End Function

    Public Sub SetAutoResizeMapPosition()
        If DataSettings.AutoresizeWindow And DataSettings.Fenstermodus Then
            BildschirmKooX = 0
            BildschirmKooY = 0
        End If
    End Sub

    ''' <summary>
    ''' Klont ein Spielfeld ohne
    ''' Wegsuchsystem,
    ''' ObjektLaufen,
    ''' Aktueller Pfeil,
    ''' Animationen,
    ''' AngriffsAnzeige,
    ''' KOInfos,
    ''' Angriff,
    ''' AnimationsBackbuffer,
    ''' RundenAnfangAnzeige,
    ''' KOAnzeige,
    ''' InfoAnzeige,
    ''' ObjektLandkartenInfo,
    ''' Aufzeichnung
    ''' Scripts
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim Maus As Boolean = ObjektMaus.Visible
        Dim S As ObjektSpielfeld = MyBase.MemberwiseClone
        S.KameraPos = New Vector3(KameraPos.X, KameraPos.Y, KameraPos.Y)
        S.AktuelleEinheit = Nothing
        S.AktuelleEinheitPosition = New Point(AktuelleEinheitPosition.X, AktuelleEinheitPosition.Y)
        S.Wegsuchsystem = Nothing
        S.Laufen = Nothing
        S.AktuelleEinheitPfeil = Nothing
        ReDim S.Animationen(-1)
        S.AngriffsAnzeige = Nothing
        S.Angriff = Nothing
        S.AnimationsBackbuffer = Nothing
        S.RundenAnfangAnzeige = Nothing
        If ObjektLandkartenInfo IsNot Nothing Then
            S.ObjektLandkartenInfo = ObjektLandkartenInfo.Clone
        End If
        If S.Aufzeichnung IsNot Nothing Then
            S.Aufzeichnung = Aufzeichnung.Clone
        End If
        ReDim S.Scripts(Scripts.Length - 1)
        For I = 0 To S.Scripts.Length - 1
            S.Scripts(I) = Scripts(I).Clone
        Next
        ReDim S.Landschaften(S.Breite - 1, S.Hoehe - 1, 1)
        ReDim S.Einheiten(S.Breite - 1, S.Hoehe - 1, 1)
        For I = 0 To 1
            For X = 0 To Breite - 1
                For Y = 0 To Hoehe - 1
                    S.Landschaften(X, Y, I) = Landschaften(X, Y, I).Clone
                    If Einheiten(X, Y, I) IsNot Nothing Then
                        S.Einheiten(X, Y, I) = Einheiten(X, Y, I).Clone
                    End If
                Next
            Next
        Next
        ReDim S.Spieler(Spieler.Length - 1)
        For I = 0 To Spieler.Length - 1
            S.Spieler(I) = Spieler(I).Clone
            For I2 = 0 To S.Spieler(I).ExternGezogeneEinheiten.Length - 1
                S.Spieler(I).ExternGezogeneEinheiten(I2).Einheit = S.Einheiten(Spieler(I).ExternGezogeneEinheiten(I2).Einheit.X, Spieler(I).ExternGezogeneEinheiten(I2).Einheit.Y, Spieler(I).ExternGezogeneEinheiten(I2).Einheit.GetMap(Me))
            Next
            S.Spieler(I).AI_Class = ObjektLadeklasse.NewKI(S.Spieler(I))
        Next

        S.Regeln = Regeln.Clone
        S.KOInfos = Nothing
        S.KOAnzeigen = Nothing
        S.InfoAnzeige = Nothing
        'Neue KI erstellen
        If AktuellerSpieler IsNot Nothing Then
            S.AktuellerSpieler = S.Spieler(AktuellerSpieler.Spieler)
            S.CurrentAI = S.AktuellerSpieler.AI_Class
        End If
        ObjektMaus.Visible = Maus
        Return S
    End Function

    Public Function CalculateMinGebaeudeFuerSieg() As Integer
        Dim G(Spieler.Length - 2) As Integer
        For X = 0 To Breite - 1
            For Y = 0 To Hoehe - 1
                If Not Landschaften(X, Y, Bodenschlacht).Hidden Then
                    Dim Gebaeude As ObjektGebaeude = Landschaften(X, Y, Bodenschlacht).Gebaeude
                    If Gebaeude IsNot Nothing Then
                        If Not TypeOf Gebaeude Is GebaeudeVerweis Then
                            If Gebaeude.Spieler > 0 Then
                                G(Gebaeude.Spieler - 1) += 1
                            End If
                        End If
                    End If
                End If
            Next
        Next
        Dim Max As Integer = G(0)
        For I = 0 To G.Length - 1
            If G(I) > Max Then
                Max = G(I)
            End If
        Next
        Return Max
    End Function
    ''' <summary>
    ''' Wie viele SChlachtfelder gibt es? 0 oder 1.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetSchlachtenZahl() As Integer
        If Regeln IsNot Nothing Then
            If Regeln.Luftschlacht Then
                Return 1
            Else
                Return 0
            End If
        Else
            Return 1
        End If
    End Function
    ''' <summary>
    ''' Wie viele Gebaeude gibt es insgesamt?
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CountBuildings() As Integer
        Dim G As Integer = 0
        For Each L In Landschaften
            If L IsNot Nothing Then
                If L.Gebaeude IsNot Nothing Then
                    If L.Gebaeude.getFonds Then
                        G += 1
                    End If
                End If
            End If
        Next
        Return G
    End Function
    ''' <summary>
    ''' Automatically Ends turns for Human Players if they can do nothing
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub AutoEndTurn()
        If DataSettings.AutoEndTurn Then
            If KOInfos Is Nothing Then
                If RundenAnfangAnzeige Is Nothing Then
                    If AktuellerSpieler IsNot Nothing Then
                        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then 'Check if the current Player is human
                            If Objektverwalter.Spielfeld.Angriff Is Nothing Then
                                If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                                    If AktuellerSpieler.KOS(1) Is Nothing Or AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then 'How should we know if you want to switch CO's or not.
                                        If (AktuellerSpieler.KOS(0).KannGabe = False And AktuellerSpieler.KannSpezialGabe = False) Or AktuellerSpieler.KOS(0).Gabemodus <> ObjektKO.Gabemodi.Keine Then
                                            If Animationen.Length = 0 Then
                                                If BackbufferSpiel.GetBufferLength = 0 Then 'We don't play an Animation
                                                    Dim MaxBattle As Integer = Bodenschlacht
                                                    If Regeln.Luftschlacht Then MaxBattle = Luftschlacht
                                                    For AirBattle = 0 To MaxBattle 'Check all Fields
                                                        For X = 0 To Breite - 1
                                                            For Y = 0 To Hoehe - 1
                                                                Dim E As ObjektEinheit = Einheiten(X, Y, AirBattle)
                                                                If E Is Nothing Then
                                                                    Dim G As ObjektGebaeude = Landschaften(X, Y, AirBattle).Gebaeude
                                                                    If G IsNot Nothing Then
                                                                        If G.GetRealGebaeudeID <> "VERWEIS" Then 'A Building is here
                                                                            If G.Spieler = AktuellerSpieler.Spieler Then
                                                                                Dim ConstructionList As String() = G.GetBaulisteThisPlayer
                                                                                For Each Unit In ConstructionList
                                                                                    If AktuellerSpieler.Fonds >= ObjektLadeklasse.GetEinheitenkosten(Unit) * AktuellerSpieler.Teurungsrate(Unit, X, Y) Then
                                                                                        'We could build a Unit exit sub
                                                                                        Exit Sub
                                                                                    End If
                                                                                Next
                                                                                If G.Feuerbereit = 0 Then 'This Building can still fire.
                                                                                    Exit Sub
                                                                                End If
                                                                                If TypeOf G Is GebaeudeFabrik Then
                                                                                    Dim Factory As GebaeudeFabrik = G
                                                                                    If Factory.Variablen(0).Wert > 0 Then
                                                                                        If Factory.GetBauEinheiten(Factory.Rechteck.X - 1, Factory.Rechteck.Y + 2).Length = 0 Then
                                                                                            If Factory.GetBauEinheiten(Factory.Rechteck.X, Factory.Rechteck.Y + 2).Length = 0 Then
                                                                                                If Factory.GetBauEinheiten(Factory.Rechteck.X + 1, Factory.Rechteck.Y + 2).Length = 0 Then
                                                                                                    Exit Sub
                                                                                                End If
                                                                                            End If
                                                                                        End If
                                                                                    End If
                                                                                End If
                                                                            End If
                                                                        End If
                                                                    End If
                                                                Else 'A Unit is here
                                                                    If E.Spieler = AktuellerSpieler.Spieler Then 'Our Unit
                                                                        If E.HatsichBewegt = False Then 'This Unit can still move
                                                                            Exit Sub
                                                                        End If
                                                                    End If
                                                                End If
                                                            Next
                                                        Next
                                                    Next
                                                    If DataSettings.KonsolenSpielBefehle Then
                                                        Konsole.Write("Auto End Turn")
                                                    End If
                                                    'Sending Game Data
                                                    If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                                                        Dim Befehl As New KINetzwerkBefehl
                                                        Befehl.Befehl = ObjektKI.KIModiExtern.RundenEnde
                                                        Befehl.KooX = -1
                                                        Befehl.KooY = -1
                                                        Befehl.WegX = New Integer() {-1}
                                                        Befehl.WegY = New Integer() {-1}
                                                        Befehl.OpferX = -1
                                                        Befehl.OpferY = -1
                                                        Befehl.AngreiferSchaden = -1
                                                        Befehl.Verteidigerschaden = -1
                                                        Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                                                        Hauptmenue.NetzBefehlSenden(Befehl)
                                                    End If
                                                    RundenEnde()
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        End If
    End Sub
    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        If TypeOf obj Is ObjektSpielfeld Then
            Dim S As ObjektSpielfeld = obj
            If S.Breite = Breite And S.Hoehe = Hoehe Then
                For I = 0 To 1
                    For X = 0 To Breite - 1
                        For Y = 0 To Hoehe - 1
                            If Landschaften(X, Y, I).getID <> S.Landschaften(X, Y, I).getID Then
                                Return False
                            ElseIf Einheiten(X, Y, I) Is Nothing And S.Einheiten(X, Y, I) IsNot Nothing Then
                                Return False
                            ElseIf Einheiten(X, Y, I) IsNot Nothing And S.Einheiten(X, Y, I) IsNot Nothing Then
                                If Einheiten(X, Y, I).Equals(S.Einheiten(X, Y, I)) = False Then
                                    Return False
                                End If
                            End If
                        Next
                    Next
                Next
            Else
                Return False
            End If
        Else
            Return False
        End If
        Return True
    End Function

#Region "Terrain Normalization"
    ''' <summary>
    ''' Returns the Normalized ID of a Terrain.
    ''' Note: This is Hardcoded!!!
    ''' </summary>
    ''' <param name="TerrainID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetTerrainID(ByVal TerrainID As String) As String
        If Regeln.Normalized Then
            Select Case TerrainID
                Case "BERG", "GIPFEL", "FELSEN"
                    Return "BERG"
                Case "WUESTE", "SCHNEE", "EBENE"
                    Return "EBENE"
                Case "EBENE+SCHROTT", "SCHNEE+SCHROTT", "WUESTE+SCHROTT"
                    Return "EBENE+SCHROTT"
                Case "FLUSS", "AUSGETROCKNETESFLUSSBETT" 'Snow missing
                    Return "FLUSS"
                Case "KAPUTTESCHWEISSNAHT", "KAPUTTEPIPESCHWEISS", "PLINEKAPUTT"
                    Return "KAPUTTESCHWEISSNAHT"
                Case "PIPELINE", "PIPE", "PLINE"
                    Return "PIPELINE"
                Case "SCHWEISSNAHT", "PLINESCHWEISS", "PIPESCHWEISS"
                    Return "SCHWEISSNAHT"
                Case "WALD", "KAKTEEN", "KIEFERN"
                    Return "WALD"
                Case "STRASSE", "STRASSENFROST", "PFAD"
                    Return "STRASSE"
                Case "METEOR", "S_METEOR", "W_METEOR"
                    Return "METEOR"
                Case "PLASMA", "S_PLASMA", "W_PLASMA"
                    Return "PLASMA"
                Case Else
                    Return TerrainID
            End Select
        Else
            Return TerrainID
        End If
    End Function
    ''' <summary>
    ''' Returns the new ID for this Terrain
    ''' Hardcoded as well
    ''' </summary>
    ''' <param name="TerrainID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetNewTerrainID(ByVal TerrainID As String) As String
        If Regeln.Normalized Then
            If Regeln.Normalized_Terrain <> ObjektRegeln.Normalized_Terrains.Keine Then
                If Regeln.Normalized_Terrain = ObjektRegeln.Normalized_Terrains.Normal Then
                    Return GetTerrainID(TerrainID)
                End If
                Select Case TerrainID
                    Case "METEOR", "S_METEOR", "W_METEOR"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "S_METEOR"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "W_METEOR"
                        End Select
                    Case "PLASMA", "S_PLASMA", "W_PLASMA"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "S_PLASMA"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "W_PLASMA"
                        End Select
                    Case "BERG", "GIPFEL", "FELSEN"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "GIPFEL"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "FELSEN"
                        End Select
                    Case "WUESTE", "SCHNEE", "EBENE"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "SCHNEE"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "WUESTE"
                        End Select
                    Case "EBENE+SCHROTT", "SCHNEE+SCHROTT", "WUESTE+SCHROTT"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "SCHNEE+SCHROTT"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "WUESTE+SCHROTT"
                        End Select
                    Case "FLUSS", "AUSGETROCKNETESFLUSSBETT" 'Snow missing
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "FLUSS"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "AUSGETROCKNETESFLUSSBETT"
                        End Select
                    Case "KAPUTTESCHWEISSNAHT", "KAPUTTEPIPESCHWEISS", "PLINEKAPUTT"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "PLINEKAPUTT"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "KAPUTTEPIPESCHWEISS"
                        End Select
                    Case "PIPELINE", "PIPE", "PLINE"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "PLINE"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "PIPE"
                        End Select
                    Case "SCHWEISSNAHT", "PLINESCHWEISS", "PIPESCHWEISS"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "PLINESCHWEISS"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "PIPESCHWEISS"
                        End Select
                    Case "WALD", "KAKTEEN", "KIEFERN"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "KIEFERN"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "KAKTEEN"
                        End Select
                    Case "STRASSE", "STRASSENFROST", "PFAD"
                        Select Case Regeln.Normalized_Terrain
                            Case ObjektRegeln.Normalized_Terrains.Schnee
                                Return "STRASSENFROST"
                            Case ObjektRegeln.Normalized_Terrains.Wueste
                                Return "PFAD"
                        End Select
                    Case Else
                        Return TerrainID
                End Select
            End If
        End If
        Return TerrainID
    End Function

    ''' <summary>
    ''' Normalizes the Terrain to a specific Terrain.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub NormalizeTerrain()
        If Regeln.Normalized Then
            If Regeln.Normalized_Terrain <> ObjektRegeln.Normalized_Terrains.Keine Then
                Dim Clone As ObjektSpielfeld = Me.Clone
                'Normalize Terrain
                For I = 0 To Luftschlacht
                    For Y = 0 To Hoehe - 1
                        For X = 0 To Breite - 1
                            Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                            Landschaften(X, Y, I) = New ObjektLandschaft(GetNewTerrainID(Landschaften(X, Y, I).LandschaftsID), X, Y, Me, Landschaften(X, Y, I).Gebaeude)
                            Landschaften(X, Y, I).RestoreLandschaft(Clone.Landschaften(X, Y, I))
                            If Landschaften(X, Y, I).TerrainUntergrundID >= 0 Then
                                Dim NormalizedUntergrund As String = GetNewTerrainID(Objektverwalter.LandschaftenBilder(Landschaften(X, Y, I).TerrainUntergrundID).ID)
                                For I2 = 0 To Objektverwalter.LandschaftenBilder.Length - 1
                                    If Objektverwalter.LandschaftenBilder(I2).ID = NormalizedUntergrund.ToUpper Then
                                        Landschaften(X, Y, I).TerrainUntergrundID = I2
                                        Landschaften(X, Y, I).TerrainUntergrundBildID = Objektverwalter.LandschaftenBilder(I2).BildID(X, Y, Me, True)
                                    End If
                                Next
                                If Objektverwalter.LandschaftenBilder(Landschaften(X, Y, I).TerrainUntergrundID).GetTerrainUntergrund.Length > 0 Then
                                    NormalizedUntergrund = GetNewTerrainID(Objektverwalter.LandschaftenBilder(Landschaften(X, Y, I).TerrainUntergrundID).GetTerrainUntergrund(0))
                                    For I2 = 0 To Objektverwalter.LandschaftenBilder.Length - 1
                                        If Objektverwalter.LandschaftenBilder(I2).ID = NormalizedUntergrund.ToUpper Then
                                            Landschaften(X, Y, I).TerrainUntergrundID2 = I2
                                            Landschaften(X, Y, I).TerrainUntergrundBildID2 = 0
                                        End If
                                    Next
                                End If
                            End If
                            If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = False Then
                                If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.GetRealGebaeudeID = "VERWEIS" Then
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude = ObjektLadeklasse.NewGebaeude(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.GebaeudeID, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Spieler, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.KP, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Besetzung, X, Y, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Feuerbereit)
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.KP = G.KP
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.SetFeuerbereit(G.Feuerbereit)
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Reichweite = G.Reichweite
                                    Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Schaden = G.Schaden
                                    If TypeOf Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude Is GebaeudeVulkan Then
                                        CType(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude, GebaeudeVulkan).FeuerbrockenProzent = CType(G, GebaeudeVulkan).FeuerbrockenProzent
                                        CType(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude, GebaeudeVulkan).Targets = CType(G, GebaeudeVulkan).Targets
                                    End If
                                End If
                            End If
                        Next
                    Next
                Next
                Objektverwalter.UebergaengeAktualiesieren()
            End If
        End If
    End Sub
#End Region
#Region "3D"
    Dim Wetter3D As Partikelklasse
    Sub WetterMalen3D(ByVal Wetter As Wetterarten)
        If Wetter3D IsNot Nothing Then
            Grafikengine.Grafikkarte.RenderState.ZBufferEnable = False
            If Wetter3D.Wetter <> Wetter Then
                Wetter3D = Partikelklasse.CreateWetter(Breite, Hoehe, Wetter)
            End If
            Wetter3D.Berechnen()
            Wetter3D.Malen()
            Grafikengine.Grafikkarte.RenderState.ZBufferEnable = True
        End If
    End Sub
#End Region
End Class